package com.swa99ylum.pxf.bean;


public abstract class Indexer {
	
	protected Index index;
	
	
	
	public void incrementIndexValue() {
		index.increment();
	}
	
	/**
	 * RowParser.parse() 时，每当发生"换行"，就需要将 index 复位
	 * SheetParser.parse() 时，每当发生"换页"，就需要将 index 复位  
	 */
	public void resetIndexValue() {
		index.reset();
	}
	
	
	public int getIndexValue() {
		
		return index.getValue();
		
	}
	
	


	/*--------------------------------------------
    |      			parentIndex 		         |
    ============================================*/
	/**
	 * 因为  parentIndex 的 值会被 之前操作的 Filler 一直更新，
	 * 所以 Indexer 中要 存放 parentIndexer 的 引用。这样，就能通过 hook 的 方式，实时获取 parentIndex 的 最新值了
	 */
	protected Index parentIndex;
	

	public boolean hasParent() {
		return parentIndex!=null;
	}
	
	public void cloneParentIndex() {
		if(index!=null && parentIndex!=null) {
			
			if(parentIndex.getValue()<0) parentIndex.initValue(0);
			
			index.initValue(parentIndex.getValue());
		}
	}
	
	
	/* 下面的 逻辑放到 CellIndexer、RowIndexer 中去了，原因：在 链式编程 式 时，避免繁重的 强制类型转换
	@SuppressWarnings("unchecked")
	public <T extends Indexer> T parent(Index parentIndex) {
		this.parentIndex = parentIndex;
		
		System.out.println(this.getClass());
		
		return (T) this;
	}
	
	
	public <T extends Indexer> Object extend2(Index parentIndex) {
		this.parentIndex = parentIndex;
		
		System.out.println(this.getClass());
		
		return this;
	}
	*/


	/*--------------------------------------------
    |      			  unreset	 		         |
    ============================================*/
	/**
	 * 默认情况下，
	 * 1) 当 fill 一组 sheets 时，每个 Sheet fill 结束，会把所有 RF 的 rowIndexer 归 0
	 * 2) 当 fill 一组 rows   时，每个 Row   fill 结束，会把所有 CF 的 cellIndexer 归 0
	 * 
	 * 当 index 为  unreset 时，
	 * 1) 在 fill 每组 sheets/rows 的 最后一个 sheet/row 之后，并不会将 index 归 0
	 * 2) 并且还会将 index0 的值，更新为 当前 index 的 值，即 最后一个 column 的 index
	 * 3) 从而实现了：让 "定义在 CF 中的 index" 具有跨 RF 的 能力
	 */
	protected boolean unreset;
	
	
	public boolean isUnreset() {
		return unreset;
	}
	
	
	


	/*--------------------------------------------
    |      			getter、setter		         |
    ============================================*/
	
	public Index getIndex() {
		return index;
	}

	public void setIndex(Index index) {
		this.index = index;
	}
	
	/** =================================================== */
	
	public static void main(String[] args) {
		
		Index index = new Index(88);
		System.out.println(index.hashCode());
		
		Index indexSon = new Index(123);
		System.out.println(indexSon.hashCode());
		
		
//		CountdownCellIndexer cci = new CountdownCellIndexer(indexSon, 0).parent(index);
//		CellIndexer aa = 		new CountdownCellIndexer(indexSon, 0).parent(index);
//		                           new CountdownCellIndexer(new Index(), 0).parent(index);
		
		
//		System.out.println("============================");
//		
//		System.out.println(cci.getIndexValue());
//		System.out.println(cci.getIndex().hashCode());
//		
//		
//		cci.parent(index);
//		
//		System.out.println(cci.getIndex().getValue());
//		System.out.println(cci.getIndex().hashCode());
		
//		CountdownCellIndexer cci2 = new CountdownCellIndexer(indexSon, 0).parent(index);
//		CountdownCellIndexer cci3 = new CountdownCellIndexer(new Index(), 0).copyIndexValue(index);
//		new CellFiller((CountdownCellIndexer)new CountdownCellIndexer(new Index(), 0).clone(index), new Object[]{"aaa"});
	}
	
	
}
